//package com.example.garbage;
//
//import com.google.ortools.linearsolver.*;
//
//public class ServiceStationOptimization {
//    static {
//        System.loadLibrary("jniortools"); // 加载OR-Tools本地库
//    }
//
//    public static void main(String[] args) {
//        // 假设数据（在实际应用中，这些数据应该是已知的）
//        int numDemandPoints = 4; // 需求点数量
//        int numCandidates = 3; // 服务站候选点数量
//        int[] demands = {10, 20, 30, 40}; // 需求点的需求量
//        double[][] distances = {
//                {50, 60, 70},
//                {40, 20, 80},
//                {30, 90, 10},
//                {70, 50, 30}
//        }; // 需求点到服务站的距离
//        int[] capacities = {50, 100, 70}; // 服务站的容量
//        double maxDistance = 70.0; // 最大服务距离
//
//        // 创建求解器
//        MPSolver solver = MPSolver.createSolver("GLOP");
//        if (solver == null) {
//            System.out.println("无法创建求解器");
//            return;
//        }
//
//        // 创建模型
//        MPModel model = solver.makeModel();
//
//        // 定义变量
//        MPVariable[] x = model.makeIntVarArray(numDemandPoints * numCandidates, 0, 1, "x"); // 分配变量
//        MPVariable[] y = model.makeIntVarArray(numCandidates, 0, 1, "y"); // 建站决策变量
//
//        // 目标1：最小化服务站数量（优先级最高）
//        double weightStation = 1000.0; // 服务站数量的权重（可以根据需要调整）
//        MPObjective minimizeStations = model.objective();
//        for (int j = 0; j < numCandidates; j++) {
//            minimizeStations.setCoefficient(y[j], weightStation);
//        }
//
//        // 目标2：在满足目标1的前提下，最小化需求点和服务站之间的距离
//        for (int i = 0; i < numDemandPoints; i++) {
//            for (int j = 0; j < numCandidates; j++) {
//                minimizeStations.setCoefficient(x[i * numCandidates + j], distances[i][j]);
//            }
//        }
//        minimizeStations.setMinimization();
//
//        // 约束1：每个需求点只由一个服务站提供服务
//        for (int i = 0; i < numDemandPoints; i++) {
//            MPConstraint constraint = model.makeConstraint(1, 1, "SingleService");
//            for (int j = 0; j < numCandidates; j++) {
//                constraint.setCoefficient(x[i * numCandidates + j], 1);
//            }
//        }
//
//        // 约束2：服务站的服务容量大于等于它所提供服务的需求点的需求量总和
//        for (int j = 0; j < numCandidates; j++) {
//            MPConstraint constraint = model.makeConstraint(0, capacities[j], "Capacity");
//            for (int i = 0; i < numDemandPoints; i++) {
//                constraint.setCoefficient(x[i * numCandidates + j], demands[i]);
//            }
//            model.addGenLessOrEqual(capacities[j] * y[j], constraint);
//        }
//
//        // 约束3：保证服务站和需求点之间的距离小于70m
//        // 这个约束已经在目标函数中考虑，因此不需要额外添加约束条件。
//
//        // 求解模型
//        MPSolver.ResultStatus resultStatus = solver.solve(model);
//
//        // 输出结果和处理解
//        if (resultStatus == MPSolver.ResultStatus.OPTIMAL) {
//            System.out.println("找到最优解！");
//            System.out.println("建立的服务站：");
//            for (int j = 0; j < numCandidates; j++) {
//                if (y[j].solutionValue() > 0.5) {
//                    System.out.println("服务站 " + j + " 被选中");
//                }
//            }
//            System.out.println("需求点分配情况：");
//            for (int i = 0; i < numDemandPoints; i++) {
//                for (int j = 0; j < numCandidates; j++) {
//                    if (x[i * numCandidates + j].solutionValue() > 0.5) {
//                        System.out.println("需求点 " + i + " 分配给服务站 " + j);
//                    }
//                }
//            }
//        } else {
//            System.out.println("未找到最优解！");
//        }
//    }
//}